GIS程序设计 知识总结
简答
1. 开发模式,开发软件的特点,概念
- 独立开发:
- 定义:不依赖于任何GIS工具软件,从空间数据的采集、编辑到数据的处理分析及结果输出,所有的算法都由开发者独立设计,然后选用某种程序设计语言,如VC++、VB、Delphi、C++ Builder等,在一定的操作系统平台上编程实现。
- 特点:
- 无需依赖任何商业GIS工具软件,减少了开发成本
- 综合程度和操作效率最高
- 单纯二次开发:
- 定义:在宏语言中调用DLL库,定义GIS系统工具不提供或不支持的功能,
- 特点:
- 功能弱,程序不美观,开发收到限制
- 增加学习负担
- 集成二次开发:
- 定义:利用专业GIS工具软件或其提供的组件来实现GIS的基本功能,采用可视化开发工具,进行集成开发。集成二次开发目前主要有OLE/DDE方式和组件式方式两种。
- 特点:
- GIS工具软件能够提供成熟的功能。例如:空间数据库存储、空间分析等
- 高效,便捷,不需要从底层学习具体的实现原理,易上手。
1. 基于arcengine或者arcobject 2. 基于com(原理)
2. 接口及类:特,用,概,接口应用
接口的特点:
1. 接口的多态性:许多不同的类可以支持相同的接口
2. 接口的继承性:所有的子类都继承了父类的接口
面向接口编程:
接口定义了能做什么,类定义了该怎么做。类实现了接口中的方法。
接口描述了一系列外部可见操作
接口具有类内置的一组属性和方法
Com类代码:
接口模块:定义方法和属性
类模块:实现方法和属性
COM 对象的接口是抽象的,接口与类不同。因为接口没有 任何的实现,所以不能通过自身实例化。因为接口没有任何的实现,所以不能通过自身实例化。接口由具体的类来实现由具体的类来实现,功能用接口抽象地模拟,并且用类去真正实现。
地图接口
- ILayer接口:所有图层类都可以实现该接口,定义了所有图层公共的方法和属性。
- Name属性:返回图层名称;
- MaximumScale属性:显示或设置图层可以出现的最大比例尺;
- MinmumScale属性:显示或设置图层可以出现的最小比例尺;
- ShowTips属性:指示当鼠标放在图层中某个要素上时,是否出现Tips;
- SpatialReference属性:设置图层的空间参考。
- IFeatureLayer接口:主要用于设置要素图层的数据源(FeatureClass)
- DataSourceType属性:返回图层的数据源类型;
- Search方法:通过2个参数,过滤器(IQueryFilter类型的对象)和布尔值(用于返回要素游标是否循环,返回一个Icursor对象)
IFeatureLayer接口继承自Ilayer接口,IFeatureClass接口继承自Iclass接口。
FeatureLayer可以创建自己的对象,FeatureClass不行
类
- ILayer接口:所有图层类都可以实现该接口,定义了所有图层公共的方法和属性。
Version类库:ArcEngine 10.0新出的类库,包含里将独立应用程序绑定到特定的ArcGIS系列产品的函数和方法。
System:ystem库是ArcGIS框架中最底层的一个库,它包含了一些被其他库使用的一些基础组件。
SystemUI:SystemUI库定义了一些在ArcGIS中被用户界面组件使用的类型。象ICommand和ITool这样的接口就在这里定义。
Geometry:几何库包含了核心的几何对象,比如点,面,线等。在几何库中还定义和实现了空间参考的对象,包括投影坐标系和几何坐标系。
Display:显示库包含了支持在输出设备上显示图形的组件,屏幕显示、符号、颜色、显示交互(Feedback)等都在这个库中定义。
Server:提供了连接、管理ArcGIS Server的核心类,如IServerObjectManager、IServerObject等,其他类库的对象可以通过ArcGIS Server的IServerContext进行远程创建。
Output:提供了将MapControl和PagelayoutControl中的地图输出到打印机以及其他设备文件中。
3. 对象模型图:类和关系,分别有什么特点
类
- 抽象类:不能用于创建对象,对子类例程进行了规定(通过类型继承)。
- 普通类:不能直接创建对象,但可以作为另一个类的属性或者通过另一个类的实例化来创建对象。
- 组件类:可以直接创建对象。
关系
关联关系:表示类之间的关系。关联的两端都定义了多样性。
组成关系:是一种“整体类”对象控制着“部分类”对象的生命期关系。
类型继承关系:定义共享父类的属性和方法,同时又具有了自己独特的属性和方法的特定对象类。
实例化关系:表示某个类的对象具有创建另一个类的对象的方法。
N元关系:表示两个以上的类相互关联。在各个关联分支的交叉点上放置一个菱形。
多样性关系:是对能于另一个对象关联的对象数目的一种限制。关联和组成关系的两端都定义了多样性。
抽象类(AbstractClass):
不能创建或实例化
- 抽象类永远不能有实例
为子类定义了泛化(general)
- 子类集成了抽象类的接口
抽象类的OMD 符号: 2维灰色矩形
普通类/可实例化类 (Class)
不能创建或实例化
抽象类永远不能有实例
为子类定义了泛化(general)
子类集成了抽象类的接口
IRow pNewRow;
ITable pTable;
pNewRow = pTable.CreateRow();
IRow row = table.CreateRow();
实例化类的OMD符号: 3维白色的矩形
组件类/可创建的类(CoClass)
可以创建:使用 New关键字
1
IMap pmap = new Map();
实例化: 从其它对象获得
1
2Imap pMap;
pMap = m_MapDocument.get_Map(i);可创建类的OMD符号:3维灰色矩形
AE控件有哪些,分类特点
- 制图控件: MapControl 和PageLayoutControl
- 框架控件: TOCControl(内容表控件) 和ToolbarControl(工具条控件)–(buddy控件捆绑)
- 许可控件:LicenseControl(启动时执行License初始化)
- 符号控件:SymbologyControl
- Reader Control: ReaderControl和ReaderControl
- 三维控件:GlobeControl和SceneControl
矢量数据集相关类的关系
- 矢量数据数据的加载,分析,查询
接口:
1. **IWorkspaceFactory**:创建工作工厂 2. **IWorkspace**:工作化工作空间 3. **IFeatureWorkspace**:接口转换为要素工作空间 4. **IFeatureClass**:创建featureClass 5. **IFeatureLayer**:创建要素图层 6. **IMap**:接收AxMapControl中的地图对象
类:
- ShapefileWorkspaceFactory:作为子类创建工作空间
- FeatureLayer:创建要素图层用于接收打开的shpfile文件的featureClass,作为图层,只是表现形式,真正的数据在FeatureClass中。
- FeatureClass是从Dataset继承过来的,FeatureClass是有空间数据字段的数据集。
程序流程(简答)
1. 数据访问,添加矢量
矢量加载:
- 获取文件路径和文件名称
- 创建地理空间工厂WorkspaceFactory(怎么创建)
- 实例化地理空间Workspace(怎么实例化)
- 获取FeatureClass
- 创建要素图层FeatureLayer
- 为要素图层定义数据集FeatureClass
- 添加至地图控件
- 刷新地图视图
2. 空间数据显示—图层渲染
1. 抽象类:Symbol,MarkerSymbol,LineSymbol,FillSymbol
2. 组件类:
1. RgbColor:颜色
2. SimpleMarkerSymbol,SimplelineSymbol,SimplefillSymbol:简单点线面符号
3. SimpleRenderer:简单渲染
- 实例化
ISimpleMarkerSymbol
,提供简单点符号 - 实例化
ISimpleRenderer
,提供简单渲染器 - 获取渲染图层赋值给
IGeoFeatureLayer
,提供要素图层对成员控制地理特征渲染的入口,获取渲染图层 - 调用
pGeoFeatureLayer.Renderer
属性赋值渲染器 - 刷新地图视图
3. 元素添加至地图
- 获取
pagelayerout
对象、活动视图pActiveView
、图形容器pGraphicsContainer
、地图窗口MapFrame
- 创建
UID
对象,设置value
- 通过
MapFrame
的CreateSurroundFrame(uid,null)
方法创建mapSurroundFrame
- 实例化一个区域几何
envelope
(包裹元素的盒子)。通过PutCoords(xmin, ymin, xmax, ymax)
方法设置地图上的位置 - 通过
mapSurroundFrame
获取Element
,设置框架的几何体属性Geometry
为区域几何对象envelope
- 通过图形容器
pGraphicsContainer
的AddElement(Element,ZOrder)
方法把地图要素添加地图布局。 - 刷新视图。
接口:
- IGraphicsContainer:管理map上的Element对象,获取图形容器
- IMapFrame:访问控制地图元素对象的成员
- IMapSurroundFrame:获取或更新存储在帧中的环绕对象(指北针、比例尺条或图例)
- IEnvelope:地物的外接矩形,用来放置元素。
- IElement:通过这一属性设置该元素的外接矩形在地图上的位置。所有图形元素和框架元素都实现的接口,可以确定元素的Geometry属性。
类:
- UID用来设置元素类型的编码
- MapFrame: 用于显示地图的图形元素。
- MapSurroundFrame:用于显示地图包围的图形元素。
- Envelope:包络线,是每个几何形体的最小外接矩形。每个Geometry都拥有一个Envelope
- Element:抽象类
1 | public void add(string value,double xmin,double ymin, double xmax, double ymax) |
4. 属性查询
步骤:
- 获取数据源
FeatureClass
- 循环给每一列写字段名
- 获取查询返回的游标,
null
代表没有查询条件,返回整个表 - 用
IFeature
接收指针指向的数据 - 将指针指向第一个要素属性行
- 如果
pFeature
不为空则循环7,8,9步 - 获取表中的新行,并将引用赋值给
DataRow
- 为每一个属性单元格赋值
- 游标指向下一行要素并重新赋值给
pFeature
- 将
DataTable
赋值给dataGridView
的数据源
类:
- QueryFilter:过滤数据通过属性值或者属性之间的关系
- QueryDef:代表了数据库中基于一个或多个表、要素类的进行的属性查询,通过这个对象,用户可以在多个表间建立连接,并且保证在这个连接基础上的查询可以实现。
- FeatureCursor:普通类,通过
pFeatureClass.Search(filter, false);
实例化
接口:
- IFeatureClass:数据源
- IQueryFilter:用于属性查询
- IFeatureCursor:查询返回的游标
- IFeature:要素,返回游标中要素集单位
5. 空间查询
步骤:
- 获取
pFeatureLayer
- 实例化过滤器
pSpatialFilter
- 创建
geometry
,用来装载框选范围 - 将框选几何
geometry
赋给pSpatialFilter
- 设置空间范围的查询条件(从空间查询窗体获得)
- 实例化查询接口
pfeatureSelection
- 调用查询方法
SelectFeatures(过滤器, esriSelectionResultEnum.esriSelectionResultNew, false);
实现高亮 - 刷新图层
接口:
- IFeatureLayer:当前的要素图层,用于接口转换
- ISpatialFilter:过滤器,用来设置空间范围的查询条件
- IGeometry:几何类型,获取框选范围
- IFeatureSelection:查询接口,用于查询,没有返回值,实现高亮
类:
- FeatureLayer:组件类,要素图层
- SpatialFilter:组件类,过滤器
- Geometry:普通类,通过
mapControl.TrackRectangle();
实例化,几何类型
程序设计题
1. 面向接口的编程及接口转换
2. 接口的继承
3. 图层的显示及渲染
1 | /// |
4. 属性查询
1 | public static DataTable getFeatureLayerTable(IFeatureLayer pFeatureLayer) |
5. 空间查询
1 | IFeatureLayer pFeatureLayer = pLayer as IFeatureLayer; |
分值
- 填空:1*15
- 选择:2*10
- 简答:基本概念、总结及功能流程 4*5
- 程序阅读:改错、对象模型图 5*3
- 程序设计:2*15
原文作者: 冯亚杰(DanBoard·Feng)
原文链接: http://danbo3110.github.io/2020/01/11/GIS程序设计 知识总结/
版权声明: 转载请注明出处(必须保留作者署名及链接)